package rtool

import (
	"crypto/md5"
	"crypto/sha1"
	"crypto/sha256"
	"crypto/sha512"
	"fmt"
	"hash/crc32"
	"hash/crc64"
	"sync/atomic"
	"time"
)

var _uniqueStr8 = time.Now().UnixNano()

// UniqueHex8 生成尽量唯一字符串，8位的十六进制。
func UniqueHex8() string {
	uniqueID := atomic.AddInt64(&_uniqueStr8, 1)
	return fmt.Sprintf("%x", crc32.ChecksumIEEE([]byte(fmt.Sprint(uniqueID))))
}

var _uniqueStr16 = time.Now().UnixNano()

// UniqueHex16 生成尽量唯一字符串，16位的十六进制。
func UniqueHex16() string {
	uniqueID := atomic.AddInt64(&_uniqueStr16, 1)
	return fmt.Sprintf("%x", crc64.Checksum([]byte(fmt.Sprint(uniqueID)), crc64.MakeTable(crc64.ECMA)))
}

var _uniqueStr32 = time.Now().UnixNano()

// UniqueHex32 生成尽量唯一字符串，32位的十六进制。
func UniqueHex32() string {
	uniqueID := atomic.AddInt64(&_uniqueStr32, 1)
	return fmt.Sprintf("%x", md5.Sum([]byte(fmt.Sprint(uniqueID))))
}

var _uniqueStr40 = time.Now().UnixNano()

// UniqueHex40 生成尽量唯一字符串，40位的十六进制。
func UniqueHex40() string {
	uniqueID := atomic.AddInt64(&_uniqueStr40, 1)
	return fmt.Sprintf("%x", sha1.Sum([]byte(fmt.Sprint(uniqueID))))
}

var _uniqueStr56 = time.Now().UnixNano()

// UniqueHex56 生成尽量唯一字符串，56位的十六进制。
func UniqueHex56() string {
	uniqueID := atomic.AddInt64(&_uniqueStr56, 1)
	return fmt.Sprintf("%x", sha256.Sum224([]byte(fmt.Sprint(uniqueID))))
}

var _uniqueStr64 = time.Now().UnixNano()

// UniqueHex64 生成尽量唯一字符串，64位的十六进制。
func UniqueHex64() string {
	uniqueID := atomic.AddInt64(&_uniqueStr64, 1)
	return fmt.Sprintf("%x", sha256.Sum256([]byte(fmt.Sprint(uniqueID))))
}

var _uniqueStr96 = time.Now().UnixNano()

// UniqueHex96 生成尽量唯一字符串，96位的十六进制。
func UniqueHex96() string {
	uniqueID := atomic.AddInt64(&_uniqueStr96, 1)
	return fmt.Sprintf("%x", sha512.Sum384([]byte(fmt.Sprint(uniqueID))))
}

var _uniqueStr128 = time.Now().UnixNano()

// UniqueHex128 生成尽量唯一字符串，128位的十六进制。
func UniqueHex128() string {
	uniqueID := atomic.AddInt64(&_uniqueStr128, 1)
	return fmt.Sprintf("%x", sha512.Sum512([]byte(fmt.Sprint(uniqueID))))
}
